home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 8 / QRZ Ham Radio Callsign Database - Volume 8.iso / pc / files / t_unix / j109lxa4.tar / smisc.c < prev    next >
C/C++ Source or Header  |  1994-06-04  |  5KB  |  269 lines

  1. /* Miscellaneous Internet servers: discard, echo and remote
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  */
  4. #include <stdio.h>
  5. #include "global.h"
  6. #include "config.h"
  7. #include "netuser.h"
  8. #include "mbuf.h"
  9. #include "socket.h"
  10. #include "proc.h"
  11. #include "remote.h"
  12. #include "smtp.h"
  13. #include "tcp.h"
  14. #include "nr4.h"
  15. #include "commands.h"
  16. #include "hardware.h"
  17. #include "mailbox.h"
  18.  
  19. char *Rempass = "";    /* Remote access password */
  20.  
  21. static int chkrpass __ARGS((struct mbuf *bp));
  22. static void discserv __ARGS((int s,void *unused,void *p));
  23. static void echoserv __ARGS((int s,void *unused,void *p));
  24.  
  25. static int Rem = -1;
  26.  
  27. #ifdef ALLSERV
  28. static int Sdisc = -1;
  29. static int Secho = -1;
  30.  
  31. /* Start up TCP discard server */
  32. int
  33. dis1(argc,argv,p)
  34. int argc;
  35. char *argv[];
  36. void *p;
  37. {
  38.     struct sockaddr_in lsocket;
  39.     int s;
  40.  
  41.     if(Sdisc != -1){
  42.         return 0;
  43.     }
  44.     psignal(Curproc,0);     /* Don't keep the parser waiting */
  45.     chname(Curproc,"Discard listener");
  46.  
  47.     lsocket.sin_family = AF_INET;
  48.     lsocket.sin_addr.s_addr = INADDR_ANY;
  49.     if(argc < 2)
  50.         lsocket.sin_port = IPPORT_DISCARD;
  51.     else
  52.         lsocket.sin_port = atoi(argv[1]);
  53.     Sdisc = socket(AF_INET,SOCK_STREAM,0);
  54.     bind(Sdisc,(char *)&lsocket,sizeof(lsocket));
  55.     listen(Sdisc,1);
  56.     for(;;){
  57.         if((s = accept(Sdisc,NULLCHAR,(int *)NULL)) == -1)
  58.             break;    /* Service is shutting down */
  59.  
  60.         /* Low mem check now done in tcpin.c - WG7J */
  61.         /* Spawn a server */
  62.         newproc("Discard server",576,discserv,s,NULL,NULL,0);
  63.     }
  64.     return 0;
  65. }
  66. static void
  67. discserv(s,unused,p)
  68. int s;
  69. void *unused;
  70. void *p;
  71. {
  72.     struct mbuf *bp;
  73.  
  74.     sockowner(s,Curproc);
  75.     log(s,"open discard");
  76.     while(recv_mbuf(s,&bp,0,NULLCHAR,NULL) > 0)
  77.         free_p(bp);
  78.     log(s,"close discard");
  79.     close_s(s);
  80. }
  81. /* Stop discard server */
  82. int
  83. dis0(argc,argv,p)
  84. int argc;
  85. char *argv[];
  86. void *p;
  87. {
  88.     close_s(Sdisc);
  89.     Sdisc = -1;
  90.     return 0;
  91. }
  92. /* Start up TCP echo server */
  93. int
  94. echo1(argc,argv,p)
  95. int argc;
  96. char *argv[];
  97. void *p;
  98. {
  99.     struct sockaddr_in lsocket;
  100.     int s;
  101.  
  102.     if(Secho != -1){
  103.         return 0;
  104.     }
  105.     psignal(Curproc,0);     /* Don't keep the parser waiting */
  106.     chname(Curproc,"Echo listener");
  107.  
  108.     lsocket.sin_family = AF_INET;
  109.     lsocket.sin_addr.s_addr = INADDR_ANY;
  110.     if(argc < 2)
  111.         lsocket.sin_port = IPPORT_ECHO;
  112.     else
  113.         lsocket.sin_port = atoi(argv[1]);
  114.     Secho = socket(AF_INET,SOCK_STREAM,0);
  115.     bind(Secho,(char *)&lsocket,sizeof(lsocket));
  116.     listen(Secho,1);
  117.     for(;;){
  118.         if((s = accept(Secho,NULLCHAR,(int *)NULL)) == -1)
  119.             break;    /* Service is shutting down */
  120.  
  121.         /* Low mem check now done in tcpin.c - WG7J */
  122.         /* Spawn a server */
  123.         newproc("Echo server",2048,echoserv,s,NULL,NULL,0);
  124.     }
  125.     return 0;
  126. }
  127. static void
  128. echoserv(s,unused,p)
  129. int s;
  130. void *unused;
  131. void *p;
  132. {
  133.     struct mbuf *bp;
  134.  
  135.     sockowner(s,Curproc);
  136.     log(s,"open echo");
  137.     while(recv_mbuf(s,&bp,0,NULLCHAR,NULL) > 0)
  138.         send_mbuf(s,bp,0,NULLCHAR,0);
  139.  
  140.     log(s,"close echo");
  141.     close_s(s);
  142. }
  143. /* stop echo server */
  144. int
  145. echo0(argc,argv,p)
  146. int argc;
  147. char *argv[];
  148. void *p;
  149. {
  150.     close_s(Secho);
  151.     Secho = -1;
  152.     return 0;
  153. }
  154.  
  155. #endif /*ALLSERV*/
  156.  
  157. extern void where_outta_here(int resetme);
  158.  
  159. /* Start remote exit/reboot server */
  160. int
  161. rem1(argc,argv,p)
  162. int argc;
  163. char *argv[];
  164. void *p;
  165. {
  166.     struct sockaddr_in lsocket,fsock;
  167.     int i;
  168.     int command;
  169.     struct mbuf *bp;
  170.     int32 addr;
  171.     char temp[20];
  172.  
  173.     if(Rem != -1){
  174.         return 0;
  175.     }
  176.     psignal(Curproc,0);
  177.     chname(Curproc,"Remote listener");
  178.     lsocket.sin_family = AF_INET;
  179.     lsocket.sin_addr.s_addr = INADDR_ANY;
  180.     if(argc < 2)
  181.         lsocket.sin_port = IPPORT_REMOTE;
  182.     else
  183.         lsocket.sin_port = atoi(argv[1]);
  184.     
  185.     Rem = socket(AF_INET,SOCK_DGRAM,0);
  186.     bind(Rem,(char *)&lsocket,sizeof(lsocket));
  187.     for(;;){
  188.         i = sizeof(fsock);
  189.         if(recv_mbuf(Rem,&bp,0,(char *)&fsock,&i) == -1)
  190.             break;
  191.         command = PULLCHAR(&bp);
  192.  
  193.         switch(command){
  194. #ifdef    MSDOS    /* Only present on PCs running MSDOS */
  195.         case SYS_RESET:
  196.             i = chkrpass(bp);
  197.             log(Rem,"Remote reset %s %s",
  198.              psocket((struct sockaddr *)&fsock),
  199.              i == 0 ? "PASSWORD FAIL" : "" );
  200.             if(i != 0){
  201.                 /*Indicate a hardware reset*/
  202.                 where_outta_here(1);
  203.             }
  204.             break;
  205. #endif
  206.         case SYS_EXIT:
  207.             i = chkrpass(bp);
  208.             log(Rem,"Remote exit %s %s",
  209.              psocket((struct sockaddr *)&fsock),
  210.              i == 0 ? "PASSWORD FAIL" : "" );
  211.             if(i != 0){
  212.                 /*No reset*/
  213.                 where_outta_here(0);
  214.             }
  215.             break;
  216.         case KICK_ME:
  217.             if(len_p(bp) >= sizeof(int32))
  218.                 addr = pull32(&bp);
  219.             else
  220.                 addr = fsock.sin_addr.s_addr;
  221.  
  222.             /* get round strange printf bug */
  223.             strcpy(temp, inet_ntoa(addr));
  224.  
  225.             log(Rem,"Remote kick by %s for host %s",
  226.              psocket((struct sockaddr *)&fsock), temp);
  227. #ifdef NETROM
  228.             donodetick();        /* g3rra's idea!..hmmm */
  229. #endif /* NETROM */
  230.             kick(addr);
  231.             smtptick((void *)addr);
  232.             break;
  233.         }
  234.         free_p(bp);
  235.     }
  236.     close_s(Rem);
  237.     Rem = -1;
  238.     return 0;
  239. }
  240. /* Check remote password */
  241. static int
  242. chkrpass(bp)
  243. struct mbuf *bp;
  244. {
  245.     char *lbuf;
  246.     int16 len;
  247.     int rval = 0;
  248.  
  249.     len = len_p(bp);
  250.     if(strlen(Rempass) != len)
  251.         return rval;
  252.     lbuf = mallocw((unsigned)len);
  253.     pullup(&bp,lbuf,len);
  254.     if(strncmp(Rempass,lbuf,(size_t)len) == 0)
  255.         rval = 1;
  256.     free(lbuf);
  257.     return rval;
  258. }
  259. int
  260. rem0(argc,argv,p)
  261. int argc;
  262. char *argv[];
  263. void *p;
  264. {
  265.     close_s(Rem);
  266.     return 0;
  267. }
  268.  
  269.